#include<iostream>
using namespace std;

class Date
{
public:
	// Date(int year = 2023, int month = 2, int day = 4)
	// {
	// 	_year = year;
	// 	_month = month;
	// 	_day = day;
	// }

	// void Print()
	// {
	// 	cout << _year << "年" << _month << "月" << _day << "日" << endl;
	// }


	//夹逼准则，通过两个已知函数修饰名，找到运算符重载的修饰名
	void test1(int x, int y)
	{}

	// d1 == d2
	bool operator==(const Date& d)
	{
		return _year == d._year && _month == d._month && _day == d._day;
	}

	void test2(int x, int y)
	{}

	// d1 != d2
	bool operator!=(const Date& d)
	{
		return !(*this == d);
	}

	void test3(int x, int y)
	{}

	// d1 < d2
	bool operator<(const Date& d)
	{
		if (_year < d._year)
			return true;
		else if (_year == d._year && _month < d._month)
			return true;
		else if (_year == d._year && _month == d._month && _day < d._day)
			return true;

		return false;
	}


	void test4(int x, int y)
	{}

	// d1 <= d2
	bool operator<=(const Date& d)
	{
		return *this < d || *this == d;
	}

	void test5(int x, int y)
	{}

	// d1 > d2
	bool operator>(const Date& d)
	{
		return !(*this < d);
	}

	void test6(int x, int y)
	{}

	// d1 >= d2
	bool operator>=(const Date& d)
	{
		return *this > d || *this == d;
	}
	
	void test7(char a, char b)
	{}

	//赋值重载
	const Date& operator=(const Date& d)
	{
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}

		return *this;
	}

	void test8(int x, int y)
	{}

	////失效，! 只允许和 = 号组合使用
	// //测试 不小于等于 修饰为什么样子
	// bool operator!<=(const Date& d)
	// {
	// 	return !(d1 <= d2);
	// }

	// d1 * d2
	Date operator*(const Date& d)
	{
		return *this * d;
	}	

	void test9(int x, int y)
	{}

	// d1 / d2
	Date operator/(const Date& d)
	{
		return *this / d;
	}

	void test10(int x, int y)
	{}

	Date operator%(const Date& d)
	{
		return *this % d;
	}	

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	Date d2;

	//cout << (d1 < d2) << endl;

	d1.test1(1,2);
	d1.test2(1,2);
	d1.test3(1,2);
	d1.test4(1,2);
	d1.test5(1,2);
	d1.test6(1,2);
	d1.test8(1,2);
	d1.test9(1,2);
	d1.test10(1,2);

	d1.operator==(d2);
	d1.test7('a', 'b');

	d1 == d2;
	d1 != d2;
	d1 < d2;
	d1 <= d2;
	d1 > d2;
	d1 >= d2;

	d1 * d2;
	d1 / d2;
	d1 % d2;

	d1 = d2;
	//d1.Print();

	return 0;
}
